home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / misc / volume6 / glib / part05 < prev    next >
Encoding:
Text File  |  1989-05-14  |  46.5 KB  |  2,364 lines

  1. Newsgroups: comp.sources.misc
  2. From: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  3. Subject: v06i106: glib part 5 of 15
  4. Reply-To: lee@uhccux.uhcc.Hawaii.Edu (Greg Lee )
  5.  
  6. Posting-number: Volume 6, Issue 106
  7. Submitted-by: lee@uhccux.uhcc.Hawaii.Edu (Greg Lee )
  8. Archive-name: glib/part05
  9.  
  10. #! /bin/sh
  11. # This is a shell archive.  Remove anything before this line, then unpack
  12. # it by saving it into a file and typing "sh file".  To overwrite existing
  13. # files, type "sh file -c".  You can also feed this as standard input via
  14. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  15. # will see the following message at the end:
  16. #        "End of archive 5 (of 15)."
  17. # Contents:  d10tra.mnu dw8000.mnu k5single.mnu vis.c
  18. # Wrapped by lee@uhccux on Sun May  7 00:40:12 1989
  19. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  20. if test -f 'd10tra.mnu' -a "${1}" != "-c" ; then 
  21.   echo shar: Will not clobber existing file \"'d10tra.mnu'\"
  22. else
  23. echo shar: Extracting \"'d10tra.mnu'\" \(10615 characters\)
  24. sed "s/^X//" >'d10tra.mnu' <<'END_OF_FILE'
  25. X/* $Id: d10tra.mnu,v 1.6 89/05/06 17:13:17 lee Exp $
  26. X * GLIB - a Generic LIBrarian and editor for synths
  27. X *
  28. X * D10 Rhythm Track Librarian
  29. X *
  30. X * Code started 2 FEB 89 --  Michael R. Kesti mrk@gvgspd.GVG.TEK.COM
  31. X * modified by Greg Lee
  32. X * $Log:    d10tra.mnu,v $
  33. X * Revision 1.6  89/05/06  17:13:17  lee
  34. X * rel. to comp.sources.misc
  35. X * 
  36. X */
  37. X
  38. X#include "glib.h"
  39. X#include "vis.h"
  40. X
  41. X#define D10TRASIZE 502
  42. X#define TRABASEADDR 0x0c0000
  43. X#define RESERVESIZE 20
  44. X
  45. Xchar *visnum(), *visonoff();
  46. X
  47. X
  48. X/* This array contains arbitrary screen labels */
  49. Xstruct labelinfo Ldtra[] = {
  50. X#MENU
  51. X
  52. X
  53. X
  54. X
  55. X
  56. X
  57. X
  58. X
  59. X
  60. X
  61. X
  62. X
  63. X               No Rhythm Track editing is supported.
  64. X
  65. X
  66. X
  67. X
  68. X
  69. X
  70. X
  71. X
  72. X
  73. X
  74. X Press SPACE BAR to sound note %   at volume %   for duration %  on channel % .
  75. X#END
  76. X-1,-1,NULL
  77. X};
  78. X
  79. Xstruct paraminfo  Pdtra[] =  {
  80. X/*
  81. XNAME        TYPE        POS    MAX    OFFSET    MASK    SHIFT    ADHOC
  82. X */
  83. X#O autopitch    num    %%    127    -60
  84. X#O autovol    num    %%    127    -63
  85. X#O autodur    num    %%    20    -5    *5
  86. X#O autochan    num    %%    16    -1    *5
  87. XNULL,NULL,-1,-1,-1,-1,visnum,0,0,0,0
  88. X};
  89. X
  90. X/*
  91. X * dtranum
  92. X *
  93. X * Convert a voice number (0) to the string displayed in the
  94. X * librarian (ie. 1).
  95. X */
  96. X
  97. Xchar *
  98. Xdtranum(n)
  99. X{
  100. X    if ( n != 0 )
  101. X        return("??");
  102. X    return("01");
  103. X}
  104. X
  105. X/*
  106. X * dnumtra
  107. X *
  108. X * Convert a display-style voice number (1) to internal
  109. X * format (0).
  110. X */
  111. X
  112. Xdnumtra(n)
  113. Xint n;
  114. X{
  115. X    if(n != 1) {
  116. X        return(-1);
  117. X    } else {
  118. X        return(0);
  119. X    }
  120. X}
  121. X
  122. X/*
  123. X * dtradin
  124. X *
  125. X * Take library bank 'data' and stuff values in the P array, by using
  126. X * the setval function.
  127. X */
  128. X
  129. Xdtradin(data)
  130. Xchar *data;
  131. X{
  132. X    /* The first RESERVESIZE bytes are reserved (arbitrarily) for the voice name */
  133. X}
  134. X
  135. X/*
  136. X * dtradout
  137. X *
  138. X * Take (possibly changed) parameters values out of the P array and
  139. X * put them back into the library bank 'data'.
  140. X */
  141. X
  142. Xdtradout(data)
  143. Xchar *data;
  144. X{
  145. X}
  146. X
  147. X/*
  148. X * dtrasedit
  149. X *
  150. X * Send a single voice to the edit buffer of the D10.  This will be whatever
  151. X * voice is currently selected.
  152. X */
  153. X
  154. Xdtrasedit(data)
  155. Xchar *data;
  156. X{
  157. X}
  158. X
  159. X/*
  160. X * dtranof
  161. X *
  162. X * Return a pointer to the voice name buried in library bank data.
  163. X */
  164. Xchar *
  165. Xdtranof(data)
  166. Xchar *data;
  167. X{
  168. X    static char buf[12];
  169. X    int n;
  170. X
  171. X    for(n = 0; n < D10TRASIZE; n++)
  172. X        if ( data[n + RESERVESIZE] != 0 ) break;
  173. X    if ( n != D10TRASIZE ) {
  174. X        n = data[RESERVESIZE + 0] + (data[RESERVESIZE + 1] << 7);
  175. X        sprintf(buf, "%d patterns", n);
  176. X    } else
  177. X        strcpy(buf, "           ");
  178. X    return(buf);
  179. X}
  180. X
  181. X/*
  182. X * dtrasnof
  183. X *
  184. X * Set the voice name buried in data to name.
  185. X */
  186. Xdtrasnof(data,name)
  187. Xchar *data;
  188. Xchar *name;
  189. X{
  190. X}
  191. X
  192. X/* dtrasone - send a single voice to the D10 */
  193. Xdtrasone(iv, data)
  194. Xint iv;
  195. Xchar *data;
  196. X{
  197. X    int n;
  198. X    int cksum;
  199. X    long curadd;
  200. X    int addbyte;
  201. X
  202. X    curadd = TRABASEADDR;
  203. X
  204. X    sendmidi(0xf0);
  205. X    sendmidi(0x41);
  206. X    sendmidi(0x10);
  207. X    sendmidi(0x16);
  208. X    sendmidi(0x12);        /* DT1 - Data set 1 command */
  209. X
  210. X    addbyte = ((curadd >> 16) & 0x7f);    /* address msb */
  211. X    sendmidi(addbyte);
  212. X    cksum = addbyte;
  213. X    addbyte = ((curadd >> 8) & 0x7f);
  214. X    sendmidi(addbyte);
  215. X    cksum += addbyte;
  216. X    addbyte = (curadd & 0x7f);        /* address lsb */
  217. X    sendmidi(addbyte);
  218. X    cksum += addbyte;
  219. X
  220. X    for(n = 0; n < 256; n++) {
  221. X        sendmidi(data[n + RESERVESIZE] & 0x7f);
  222. X        cksum += data[n + RESERVESIZE] & 0x7f;
  223. X    }
  224. X
  225. X    sendmidi((-cksum) & 0x7f);    /* checksum */
  226. X    sendmidi(EOX);
  227. X
  228. X    curadd = 0x0c0200;
  229. X
  230. X    sendmidi(0xf0);
  231. X    sendmidi(0x41);
  232. X    sendmidi(0x10);
  233. X    sendmidi(0x16);
  234. X    sendmidi(0x12);        /* DT1 - Data set 1 command */
  235. X
  236. X    addbyte = ((curadd >> 16) & 0x7f);    /* address msb */
  237. X    sendmidi(addbyte);
  238. X    cksum = addbyte;
  239. X    addbyte = ((curadd >> 8) & 0x7f);
  240. X    sendmidi(addbyte);
  241. X    cksum += addbyte;
  242. X    addbyte = (curadd & 0x7f);        /* address lsb */
  243. X    sendmidi(addbyte);
  244. X    cksum += addbyte;
  245. X
  246. X    for(n = 256; n < 512; n++) {
  247. X        sendmidi(data[n + RESERVESIZE] & 0x7f);
  248. X        cksum += data[n + RESERVESIZE] & 0x7f;
  249. X    }
  250. X
  251. X    sendmidi((-cksum) & 0x7f);    /* checksum */
  252. X    sendmidi(EOX);
  253. X
  254. X    curadd = 0x0c0400;
  255. X
  256. X    sendmidi(0xf0);
  257. X    sendmidi(0x41);
  258. X    sendmidi(0x10);
  259. X    sendmidi(0x16);
  260. X    sendmidi(0x12);        /* DT1 - Data set 1 command */
  261. X
  262. X    addbyte = ((curadd >> 16) & 0x7f);    /* address msb */
  263. X    sendmidi(addbyte);
  264. X    cksum = addbyte;
  265. X    addbyte = ((curadd >> 8) & 0x7f);
  266. X    sendmidi(addbyte);
  267. X    cksum += addbyte;
  268. X    addbyte = (curadd & 0x7f);        /* address lsb */
  269. X    sendmidi(addbyte);
  270. X    cksum += addbyte;
  271. X
  272. X    for(n = 512; n < (D10TRASIZE - 512); n++) {
  273. X        sendmidi(data[n + RESERVESIZE] & 0x7f);
  274. X        cksum += data[n + RESERVESIZE] & 0x7f;
  275. X    }
  276. X
  277. X    sendmidi((-cksum) & 0x7f);    /* checksum */
  278. X    sendmidi(EOX);
  279. X
  280. X    return(0);
  281. X}
  282. X
  283. X/* dtragbulk - Request and read a bulk dump from the D10 */
  284. Xdtragbulk(data)
  285. Xchar *data;
  286. X{
  287. X    static    char Buff[BUFSIZ];
  288. X    int n, v, b2, ret = 1;
  289. X    long begin, toolong;
  290. X    long curadd;
  291. X    int addbyte;
  292. X    int cksum;
  293. X
  294. X    sprintf(Buff,"\n");
  295. X    windstr(Buff);
  296. X    
  297. X    curadd = TRABASEADDR;
  298. X
  299. X    for(v = 0; v < Nvoices; v++) {
  300. X
  301. X        flushmidi();
  302. X
  303. X        if(v % 10 != 0) {
  304. X            sprintf(Buff, ".");
  305. X        } else {
  306. X            sprintf(Buff,"%d", (v / 10));
  307. X        }
  308. X        windstr(Buff);
  309. X
  310. X    /* request the voice */
  311. X        sendmidi(0xf0);
  312. X        sendmidi(0x41);
  313. X        sendmidi(0x10);
  314. X        sendmidi(0x16);
  315. X        sendmidi(0x11);        /* RQ1 - Data request 1 command */
  316. X
  317. X        addbyte = ((curadd >> 16) & 0x7f);    /* address msb */
  318. X        sendmidi(addbyte);
  319. X        cksum = addbyte;
  320. X        addbyte = ((curadd >> 8) & 0x7f);
  321. X        sendmidi(addbyte);
  322. X        cksum += addbyte;
  323. X        addbyte = (curadd & 0x7f);        /* address lsb */
  324. X        sendmidi(addbyte);
  325. X        cksum += addbyte;
  326. X
  327. X        sendmidi(0x00);        /* length msb */
  328. X        cksum += 0x00;
  329. X        sendmidi(0x03);        /* should be D10TRASIZE */
  330. X        cksum += 0x03;
  331. X        sendmidi(0x76);        /* length lsb */
  332. X        cksum += 0x76;
  333. X
  334. X        sendmidi((-cksum) & 0x7f);    /* checksum */
  335. X        sendmidi(EOX);
  336. X    
  337. X    /* set up timeout */
  338. X        begin = milliclock();
  339. X        toolong = begin + (1000 * TIMEOUT);
  340. X
  341. X    /* read header */
  342. X        for(n = 0; n < 8; ) {
  343. X            if ( STATMIDI ) {
  344. X                b2 = (getmidi() & 0xff);
  345. X                /* burn active sensing and timing clock */
  346. X                if((b2 != 0xfe) && (b2 != 0xf8))
  347. X                    n++;
  348. X            } else {
  349. X                if ( milliclock() > toolong ) {
  350. X                    Reason = "Timeout waiting for header";
  351. X                    goto getout;
  352. X                }
  353. X            }
  354. X        }
  355. X
  356. X    /* read data */
  357. X        for(n = 0; n < 256; ) {
  358. X            if ( STATMIDI ) {
  359. X                b2 = (getmidi() & 0xff);
  360. X                /* burn active sensing and timing clock */
  361. X                if((b2 != 0xfe) && (b2 != 0xf8)) {
  362. X                    VOICEBYTE(data,v,n + RESERVESIZE) = b2;
  363. X                    n++;
  364. X                }
  365. X            } else {
  366. X                if ( milliclock() > toolong ) {
  367. X                    Reason = "Timeout reading data";
  368. X                    goto timeout0;
  369. X                }
  370. X            }
  371. X        }
  372. X
  373. X    timeout0:
  374. X        if ( n != 256 ) {
  375. X            Reason = "Timeout reading data!";
  376. X            goto getout;
  377. X        }
  378. X
  379. X    /* read checksum */
  380. X        for(n = 0; n < 1; ) {
  381. X            if ( STATMIDI ) {
  382. X                b2 = (getmidi() & 0xff);
  383. X                /* burn active sensing and timing clock */
  384. X                if((b2 != 0xfe) && (b2 != 0xf8))
  385. X                    n++;
  386. X            } else {
  387. X                if ( milliclock() > toolong ) {
  388. X                    Reason = "Timeout reading checksum";
  389. X                    goto getout;
  390. X                }
  391. X            }
  392. X        }
  393. X
  394. X    /* read EOX */
  395. X        for(n = 0; n < 1; ) {
  396. X            if ( STATMIDI ) {
  397. X                b2 = (getmidi() & 0xff);
  398. X                /* burn active sensing and timing clock */
  399. X                if((b2 != 0xfe) && (b2 != 0xf8))
  400. X                    if ( b2 != EOX ) {
  401. X                        sprintf(Buff,"EOX not received (%X)\n", b2);
  402. X                        Reason = Buff;
  403. X                        goto getout;
  404. X                    }
  405. X                    n++;
  406. X            } else {
  407. X                if ( milliclock() > toolong ) {
  408. X                    Reason = "Timeout reading EOX";
  409. X                    goto getout;
  410. X                }
  411. X            }
  412. X        }
  413. X
  414. X    /* read header */
  415. X        for(n = 0; n < 8; ) {
  416. X            if ( STATMIDI ) {
  417. X                b2 = (getmidi() & 0xff);
  418. X                /* burn active sensing and timing clock */
  419. X                if((b2 != 0xfe) && (b2 != 0xf8))
  420. X                    n++;
  421. X            } else {
  422. X                if ( milliclock() > toolong ) {
  423. X                    Reason = "Timeout waiting for header";
  424. X                    goto getout;
  425. X                }
  426. X            }
  427. X        }
  428. X
  429. X    /* read data */
  430. X        for(n = 0; n < 246; ) {
  431. X            if ( STATMIDI ) {
  432. X                b2 = (getmidi() & 0xff);
  433. X                /* burn active sensing and timing clock */
  434. X                if((b2 != 0xfe) && (b2 != 0xf8)) {
  435. X                    VOICEBYTE(data,v,n + RESERVESIZE + 256) = b2;
  436. X                    n++;
  437. X                }
  438. X            } else {
  439. X                if ( milliclock() > toolong ) {
  440. X                    Reason = "Timeout reading data";
  441. X                    goto timeout1;
  442. X                }
  443. X            }
  444. X        }
  445. X
  446. X    timeout1:
  447. X        if ( n != 246 ) {
  448. X            Reason = "Timeout reading data!";
  449. X            goto getout;
  450. X        }
  451. X
  452. X    /* read checksum */
  453. X        for(n = 0; n < 1; ) {
  454. X            if ( STATMIDI ) {
  455. X                b2 = (getmidi() & 0xff);
  456. X                /* burn active sensing and timing clock */
  457. X                if((b2 != 0xfe) && (b2 != 0xf8))
  458. X                    n++;
  459. X            } else {
  460. X                if ( milliclock() > toolong ) {
  461. X                    Reason = "Timeout reading checksum";
  462. X                    goto getout;
  463. X                }
  464. X            }
  465. X        }
  466. X
  467. X    /* read EOX */
  468. X        for(n = 0; n < 1; ) {
  469. X            if ( STATMIDI ) {
  470. X                b2 = (getmidi() & 0xff);
  471. X                /* burn active sensing and timing clock */
  472. X                if((b2 != 0xfe) && (b2 != 0xf8))
  473. X                    if ( b2 != EOX ) {
  474. X                        sprintf(Buff,"EOX not received (%X)\n", b2);
  475. X                        Reason = Buff;
  476. X                        goto getout;
  477. X                    }
  478. X                    n++;
  479. X            } else {
  480. X                if ( milliclock() > toolong ) {
  481. X                    Reason = "Timeout reading EOX";
  482. X                    goto getout;
  483. X                }
  484. X            }
  485. X        }
  486. X
  487. X        curadd += 0x376;        /* D10TRASIZE */
  488. X
  489. X        if((curadd & 0x80) != 0) {
  490. X            curadd &= 0x7fff7f;
  491. X            curadd += 0x100;
  492. X        }
  493. X        if((curadd & 0x8000) != 0) {
  494. X            curadd &= 0x7f7f7f;
  495. X            curadd += 0x10000;
  496. X        }
  497. X    } /* go back for another voice */
  498. X
  499. X    Reason = "";
  500. X    ret = 0;    /* all's well */
  501. X
  502. Xgetout:
  503. X    return(ret);
  504. X}
  505. X
  506. X/* dtrasbulk - send a bulk dump to the D10 */
  507. Xdtrasbulk(data)
  508. Xchar *data;
  509. X{
  510. X    int n;
  511. X    int cksum;
  512. X    long curadd;
  513. X    int addbyte;
  514. X
  515. X    curadd = TRABASEADDR;
  516. X
  517. X    sendmidi(0xf0);
  518. X    sendmidi(0x41);
  519. X    sendmidi(0x10);
  520. X    sendmidi(0x16);
  521. X    sendmidi(0x12);        /* DT1 - Data set 1 command */
  522. X
  523. X    addbyte = ((curadd >> 16) & 0x7f);    /* address msb */
  524. X    sendmidi(addbyte);
  525. X    cksum = addbyte;
  526. X    addbyte = ((curadd >> 8) & 0x7f);
  527. X    sendmidi(addbyte);
  528. X    cksum += addbyte;
  529. X    addbyte = (curadd & 0x7f);        /* address lsb */
  530. X    sendmidi(addbyte);
  531. X    cksum += addbyte;
  532. X
  533. X    for(n = 0; n < 256; n++) {
  534. X        sendmidi(data[n + RESERVESIZE] & 0x7f);
  535. X        cksum += data[n + RESERVESIZE] & 0x7f;
  536. X    }
  537. X
  538. X    sendmidi((-cksum) & 0x7f);    /* checksum */
  539. X    sendmidi(EOX);
  540. X
  541. X    curadd = 0x0c0200;
  542. X
  543. X    sendmidi(0xf0);
  544. X    sendmidi(0x41);
  545. X    sendmidi(0x10);
  546. X    sendmidi(0x16);
  547. X    sendmidi(0x12);        /* DT1 - Data set 1 command */
  548. X
  549. X    addbyte = ((curadd >> 16) & 0x7f);    /* address msb */
  550. X    sendmidi(addbyte);
  551. X    cksum = addbyte;
  552. X    addbyte = ((curadd >> 8) & 0x7f);
  553. X    sendmidi(addbyte);
  554. X    cksum += addbyte;
  555. X    addbyte = (curadd & 0x7f);        /* address lsb */
  556. X    sendmidi(addbyte);
  557. X    cksum += addbyte;
  558. X
  559. X    for(n = 256; n < 512; n++) {
  560. X        sendmidi(data[n + RESERVESIZE] & 0x7f);
  561. X        cksum += data[n + RESERVESIZE] & 0x7f;
  562. X    }
  563. X
  564. X    sendmidi((-cksum) & 0x7f);    /* checksum */
  565. X    sendmidi(EOX);
  566. X
  567. X    curadd = 0x0c0400;
  568. X
  569. X    sendmidi(0xf0);
  570. X    sendmidi(0x41);
  571. X    sendmidi(0x10);
  572. X    sendmidi(0x16);
  573. X    sendmidi(0x12);        /* DT1 - Data set 1 command */
  574. X
  575. X    addbyte = ((curadd >> 16) & 0x7f);    /* address msb */
  576. X    sendmidi(addbyte);
  577. X    cksum = addbyte;
  578. X    addbyte = ((curadd >> 8) & 0x7f);
  579. X    sendmidi(addbyte);
  580. X    cksum += addbyte;
  581. X    addbyte = (curadd & 0x7f);        /* address lsb */
  582. X    sendmidi(addbyte);
  583. X    cksum += addbyte;
  584. X
  585. X    for(n = 512; n < (D10TRASIZE - 512); n++) {
  586. X        sendmidi(data[n + RESERVESIZE] & 0x7f);
  587. X        cksum += data[n + RESERVESIZE] & 0x7f;
  588. X    }
  589. X
  590. X    sendmidi((-cksum) & 0x7f);    /* checksum */
  591. X    sendmidi(EOX);
  592. X
  593. X    return(0);
  594. X}
  595. X
  596. X/* end */
  597. END_OF_FILE
  598. if test 10615 -ne `wc -c <'d10tra.mnu'`; then
  599.     echo shar: \"'d10tra.mnu'\" unpacked with wrong size!
  600. fi
  601. # end of 'd10tra.mnu'
  602. fi
  603. if test -f 'dw8000.mnu' -a "${1}" != "-c" ; then 
  604.   echo shar: Will not clobber existing file \"'dw8000.mnu'\"
  605. else
  606. echo shar: Extracting \"'dw8000.mnu'\" \(10982 characters\)
  607. sed "s/^X//" >'dw8000.mnu' <<'END_OF_FILE'
  608. X/* $Id: dw8000.mnu,v 1.6 89/05/06 17:13:21 lee Exp $
  609. X * GLIB - a Generic LIBrarian and editor for synths
  610. X *
  611. X * DW8000 Librarian
  612. X *
  613. X * Code completed 8/24/87 --  Steven A. Falco  moss!saf
  614. X * modifications: Greg Lee
  615. X * $Log:    dw8000.mnu,v $
  616. X * Revision 1.6  89/05/06  17:13:21  lee
  617. X * rel. to comp.sources.misc
  618. X * 
  619. X */
  620. X
  621. X#define OVERLAY2
  622. X
  623. X#include "glib.h"
  624. X
  625. X#define DW8VSIZE 51
  626. X
  627. Xchar *visnum(), *visd8wave(), *visd8oct(), *visd8trk();
  628. Xchar *visd8ival(), *visd8detu(), *visdasel(), *dw8vnum(), *visdamod();
  629. Xchar *visdmgw(), *visdmode(), *visd8pol(),*visd8sem(), *visonoff();
  630. X
  631. X#define RESERVESIZE 20
  632. X
  633. X#define visdw8vnum dw8vnum
  634. X/* This array contains arbitrary screen labels */
  635. Xstruct labelinfo  Ldw800[] =  {
  636. X#MENU
  637. X
  638. X
  639. X+----------------------------------+----------------+------------------+------+
  640. X|         Osc 1     Osc 2     Noise|          ModGen|          AutoBend| Mode |
  641. X|Octave   %         %              |Waveform  %     |Select    %       |%     |
  642. X|Waveform %         %              |Frequency %     |Mode      %       |      |
  643. X|Level    %         %         %    |Delay     %     |Time      %       |      |
  644. X|Interval           %              |Osc       %     |Intensity %       |      |
  645. X|Detune             %              |VCF       %     |                  |      |
  646. X+------------------+---------------+----------------+------------------+------+
  647. X|          VCF  VCA|          Delay|    Joystick    |     Portamento   |Key   |
  648. X|Attack    %    %  |Time      %    |Osc %           |Time %            |Param |
  649. X|Decay     %    %  |Factor    %    |VCF %           |                  |%     |
  650. X|Break Pt. %    %  |Feedback  %    +----------------+------------------+------+
  651. X|Slope     %    %  |Frequency %    |
  652. X|Sustain   %    %  |Intensity %    | +-------------------------+--------------+
  653. X|Release   %    %  |Eff.Level %    | |Space = Play Note        | Auto-Note    |
  654. X|V.Sensitv %    %  +---------------+ |                         |              |
  655. X|Cutoff    %       |       AftTouch| |h = left   q = quit      |Pitch    %    |
  656. X|Resonance %       |Osc.MG %       | |j = down   N = Set Name  |Duration %    |
  657. X|Tracking  %       |VCF    %       | |k = up     J = Decrement |Volume   %    |
  658. X|Polarity  %       |VCA    %       | |l = right  K = Increment |Channel  %    |
  659. X|EG.Intens %       |               | |                         |              |
  660. X+------------------+---------------+ +-------------------------+--------------+
  661. X#END
  662. X-1,-1,NULL
  663. X};
  664. X
  665. X/* This array defines all the editable parameters. */
  666. Xstruct paraminfo  Pdw800[] =  {
  667. X/*
  668. XNAME        TYPE    POS    MAX    OFFSET    MASK    SHIFT    ADHOC
  669. X */
  670. X#O o1oct    d8oct    %%    3    0
  671. X#O o2oct    d8oct    %%    3    7
  672. X#O mgwave    dmgw    %%    3    34
  673. X#O abndsel    dasel    %%    3    3
  674. X#O mode        dmode    %%    3    13
  675. X#O o1wave    d8wave    %%    15    1
  676. X#O o2wave    d8wave    %%    15    8
  677. X#O mgfrew    num    %%    31    35
  678. X#O abndmod    damod    %%    1    4
  679. X#O o1lev    num    %%    31    2
  680. X#O o2lev    num    %%    31    9
  681. X#O noise    num    %%    31    12
  682. X#O mgdela    num    %%    31    36
  683. X#O abndtim    num    %%    31    5
  684. X#O o2ival    d8ival    %%    7    10
  685. X#O mgosc    num    %%    31    37
  686. X#O abndins    num    %%    31    6
  687. X#O o2detu    d8detu    %%    7    11
  688. X#O mgvcf    num    %%    31    38
  689. X#O fatt        num    %%    31    20
  690. X#O aatt        num    %%    31    27
  691. X#O dtim        num    %%    7    41
  692. X#O joyosc    d8sem    %%    15    39
  693. X#O portam    num    %%    31    47
  694. X#O fdec        num    %%    31    21
  695. X#O adec        num    %%    31    28
  696. X#O dfact    num    %%    15    42
  697. X#O joyvcf    onoff    %%    1    40
  698. X#O vnumb    dw8vnum    %%    63    14
  699. X#O fbrk        num    %%    31    22
  700. X#O abrk        num    %%    31    29
  701. X#O dfeed    num    %%    15    43
  702. X#O fslp        num    %%    31    23
  703. X#O aslp        num    %%    31    30
  704. X#O dfreq    num    %%    31    44
  705. X#O fsus        num    %%    31    24
  706. X#O asus        num    %%    31    31
  707. X#O dintns    num    %%    31    45
  708. X#O frel        num    %%    31    25
  709. X#O arel        num    %%    31    32
  710. X#O deff        num    %%    15    46
  711. X#O asens    num    %%    7    33
  712. X#O fsens    num    %%    7    26
  713. X#O fcut        num    %%    63    15
  714. X#O autopitch    num    %%    127    -60
  715. X#O fres        num    %%    31    16
  716. X#O autovol    num    %%    127    -63
  717. X#O atosc    num    %%    3    48
  718. X#O ftrk        d8trk    %%    3    17
  719. X#O autodur    num    %%    20    -5    *5
  720. X#O atvcf    num    %%    3    49
  721. X#O fpol        d8pol    %%    1    18
  722. X#O autochan    num    %%    16    -1    *5
  723. X#O atvca    num    %%    3    50
  724. X#O fegi        num    %%    31    19
  725. XNULL,NULL,-1,-1,-1,-1,visnum,0,0,0,0
  726. X};
  727. X
  728. X
  729. X/*
  730. X * dw8vnum
  731. X *
  732. X * Convert a voice number (0 to 63) to the string displayed in the
  733. X * librarian (ie. 11 to 88).
  734. X */
  735. X/* added vis to beginning of this name -- gl */
  736. Xchar *
  737. Xdw8vnum(n)
  738. X{
  739. X    static char v[3];
  740. X
  741. X    if ( n < 0 || n > 63 )
  742. X        return("??");
  743. X
  744. X    v[0] = n/8 + '1';
  745. X    v[1] = n%8 + '1';
  746. X    v[2] = '\0';
  747. X    return(v);
  748. X}
  749. X
  750. X/*
  751. X * dw8numv
  752. X *
  753. X * Convert a display-style voice number (11 to 88) to internal
  754. X * format (0 - 63).
  755. X */
  756. X
  757. Xdw8numv(n)
  758. Xint n;
  759. X{
  760. X    int ld, rd;
  761. X    
  762. X    /* crack out the digits as octal codes */
  763. X    ld = (n / 10) - 1; /* left digit */
  764. X    rd = (n % 10) - 1; /* right digit */
  765. X    
  766. X    if(ld < 0 || ld > 7 || rd < 0 || rd > 7) {
  767. X        return(-1);
  768. X    } else {
  769. X        return(ld * 8 + rd); /* combine as octal */
  770. X    }
  771. X}
  772. X
  773. X/*
  774. X * dw8din
  775. X *
  776. X * Take library bank 'data' and stuff values in the P array, by using
  777. X * the setval function.
  778. X */
  779. X
  780. Xdw8din(data)
  781. Xchar *data;
  782. X{
  783. X    /* The first 20 bytes are reserved (arbitrarily) for the voice name */
  784. X#SETVAL
  785. X    /* We set the 'auto-note' channel upon entry */
  786. X    setval("autochan",Channel);
  787. X}
  788. X
  789. X/*
  790. X * dw8dout
  791. X *
  792. X * Take (possibly changed) parameters values out of the P array and
  793. X * put them back into the library bank 'data'.
  794. X */
  795. X
  796. Xdw8dout(data)
  797. Xchar *data;
  798. X{
  799. X#GETVAL
  800. X    /* If the autochan parameter has changed, update Channel */
  801. X    Channel = getval("autochan");
  802. X}
  803. X
  804. X/*
  805. X * dw8sedit
  806. X *
  807. X * Send a single voice to the edit buffer of the DW8000.  This will be whatever
  808. X * voice is currently selected.
  809. X */
  810. X
  811. Xdw8sedit(data)
  812. Xchar *data;
  813. X{
  814. X    int n;
  815. X    
  816. X    sendmidi(0xf0);
  817. X    sendmidi(0x42);
  818. X    sendmidi(0x30 | (Channel - 1));
  819. X    sendmidi(0x03);
  820. X    sendmidi(0x40);
  821. X    for(n = 0; n < DW8VSIZE; n++) {
  822. X        sendmidi(data[n + 20] & 0x7f);
  823. X    }
  824. X    sendmidi(EOX);
  825. X}
  826. X
  827. X/*
  828. X * dw8nof
  829. X *
  830. X * Return a pointer to the voice name buried in library bank data.
  831. X */
  832. Xchar *
  833. Xdw8nof(data)
  834. Xchar *data;
  835. X{
  836. X    static char currbuff[17];
  837. X    char *p;
  838. X    int m;
  839. X
  840. X    p = currbuff;
  841. X    for ( m=0; m<16; m++ )
  842. X        *p++ = data[m];
  843. X    *p = '\0';
  844. X    return(currbuff);
  845. X}
  846. X
  847. X/*
  848. X * dw8snof
  849. X *
  850. X * Set the voice name buried in data to name.
  851. X */
  852. Xdw8snof(data,name)
  853. Xchar *data;
  854. Xchar *name;
  855. X{
  856. X    char *p;
  857. X    int m;
  858. X
  859. X    for ( p=name,m=0; *p!='\0' && m<16; p++,m++ )
  860. X        data[m] = *p;
  861. X    for ( ; m<16; m++ )
  862. X        data[m] = ' ';
  863. X}
  864. X
  865. X/* dw8sone - send a single voice to the DW8000 */
  866. Xdw8sone(iv, data)
  867. Xint iv;
  868. Xchar *data;
  869. X{
  870. X    int c, b2, ret = 1;
  871. X    long begin, toolong;
  872. X
  873. X    /* select voice n */
  874. X    sendmidi(0xc0 | (Channel - 1));
  875. X    sendmidi(iv);
  876. X    
  877. X    /* send data */
  878. X    dw8sedit(data);
  879. X    
  880. X    /* request write */
  881. X    sendmidi(0xf0);
  882. X    sendmidi(0x42);
  883. X    sendmidi(0x30 | (Channel - 1));
  884. X    sendmidi(0x03);
  885. X    sendmidi(0x11);    /* write request */
  886. X    sendmidi(iv);    /* the now-current voice */
  887. X    sendmidi(EOX);
  888. X    
  889. X    /* read the ack/nack - set up for timeout */
  890. X    begin = milliclock();
  891. X    toolong = begin + 1000 * TIMEOUT;
  892. X
  893. X    /* wait for the 0x03 byte (dw8000 ID byte) */
  894. X    while ( milliclock() < toolong ) {
  895. X        if ( STATMIDI && (c=(getmidi() & 0xff)) == 0x03 )
  896. X            break;
  897. X    }
  898. X    if ( c != 0x03 ) {
  899. X        Reason = "Timeout waiting for 0x03";
  900. X        goto getout;
  901. X    }
  902. X    
  903. X    /* next byte is the result code */
  904. X    while((b2 = getmidi() & 0xff) == 0xfe)
  905. X        ; /* burn active sensing */
  906. X    if(b2 != 0x21) {
  907. X        Reason = "Write failed - check protect switch!";
  908. X        goto getout;
  909. X    }
  910. X
  911. X    while((b2 = getmidi() & 0xff) == 0xfe)
  912. X        ;    /* want EOX - burn active sensing */
  913. X    if ( b2 != EOX )
  914. X        Reason = "EOX not received";
  915. X    else {
  916. X        Reason = "";
  917. X        ret = 0;    /* all's well */
  918. X    }
  919. X    
  920. Xgetout:
  921. X    return(ret);
  922. X}
  923. X
  924. X/* dw8gbulk - Request and read a bulk dump from the DW8000 */
  925. Xdw8gbulk(data)
  926. Xchar *data;
  927. X{
  928. X    int c, n, v, b2, ret = 1;
  929. X    long begin, toolong;
  930. X
  931. X    flushmidi();
  932. X
  933. X    for(v = 0; v < Nvoices; v++) {
  934. X        /* select voice */
  935. X        sendmidi(0xc0 | (Channel - 1));
  936. X        sendmidi(v);
  937. X        
  938. X        /* request the voice */
  939. X        sendmidi(0xf0);
  940. X        sendmidi(0x42);
  941. X        sendmidi(0x30 | (Channel-1));    /* Channel # */
  942. X        sendmidi(0x03);
  943. X        sendmidi(0x10);    
  944. X        sendmidi(EOX);
  945. X    
  946. X        /* set up for timeout */
  947. X        begin = milliclock();
  948. X        toolong = begin + 1000 * TIMEOUT;
  949. X    
  950. X        /* wait for the x40 byte starting the dump */
  951. X        while ( milliclock() < toolong ) {
  952. X            if ( STATMIDI && (c=(getmidi() & 0xff)) == 0x40 )
  953. X                break;
  954. X        }
  955. X        if ( c != 0x40 ) {
  956. X            Reason = "Timeout waiting for 0x40";
  957. X            goto getout;
  958. X        }
  959. X        
  960. X        /* now read 51 bytes of voice data */
  961. X        for(n = 0; n < DW8VSIZE; n++) {
  962. X            /* twiddle your thumbs, but not forever */
  963. X            while ( ! STATMIDI ) {
  964. X                if ( milliclock() > toolong )
  965. X                    goto timeout;    /* the end of an era */
  966. X            }
  967. X            while((b2 = getmidi() & 0xff) == 0xfe)
  968. X                ; /* burn active sensing */
  969. X            VOICEBYTE(data,v,n + 20) = b2;    
  970. X        }
  971. X
  972. X    timeout:
  973. X        if ( n != DW8VSIZE ) {
  974. X            Reason = "Timeout while reading!";
  975. X            goto getout;
  976. X        }
  977. X        while((b2 = getmidi() & 0xff) == 0xfe)
  978. X            ;    /* want EOX - burn active sensing */
  979. X        if ( b2 != EOX )
  980. X            Reason = "EOX not received";
  981. X        else {
  982. X            Reason = "";
  983. X            ret = 0;    /* all's well */
  984. X        }
  985. X    } /* go back for another voice */
  986. X    
  987. Xgetout:
  988. X    return(ret);
  989. X}
  990. X
  991. X/*
  992. X * Below are functions used for display of parameter values
  993. X */
  994. X
  995. Xchar *
  996. Xvisd8wave(v)
  997. X{
  998. X    switch (v) {
  999. X    case 0: return("ramp");
  1000. X    case 1: return("square");
  1001. X    case 2: return("ac. piano");
  1002. X    case 3: return("el. piano");
  1003. X    case 4: return("hd. piano");
  1004. X    case 5: return("clavinet");
  1005. X    case 6: return("organ");
  1006. X    case 7: return("brass");
  1007. X    case 8: return("sax");
  1008. X    case 9: return("violin");
  1009. X    case 10: return("a. guitar");
  1010. X    case 11: return("d. guitar");
  1011. X    case 12: return("el. bass");
  1012. X    case 13: return("dg. bass");
  1013. X    case 14: return("bell");
  1014. X    case 15: return("sine");
  1015. X    }
  1016. X    return("*");
  1017. X}
  1018. X
  1019. Xchar *
  1020. Xvisd8oct(v)
  1021. X{
  1022. X    switch(v) {
  1023. X    case 0: return("16");
  1024. X    case 1: return("8");
  1025. X    case 2: return("4");
  1026. X    case 3: return("*");
  1027. X    }
  1028. X    return("*");
  1029. X}
  1030. X
  1031. Xchar *
  1032. Xvisd8ival(v)
  1033. X{    
  1034. X    switch(v) {
  1035. X    case 0: return("unison");
  1036. X    case 1: return("min 3rd");
  1037. X    case 2: return("maj 3rd");
  1038. X    case 3: return("4th");
  1039. X    case 4: return("5th");
  1040. X    case 5: case 6: case 7: return("*");
  1041. X    }
  1042. X    return("*");
  1043. X}
  1044. X
  1045. Xchar *
  1046. Xvisd8detu(v)
  1047. X{
  1048. X    switch(v) {
  1049. X    case 0: return("in tune");
  1050. X    case 1: return("1 cent");
  1051. X    case 2: return("2 cents");
  1052. X    case 3: return("3 cents");
  1053. X    case 4: return("4 cents");
  1054. X    case 5: return("5 cents");
  1055. X    case 6: return("6 cents");
  1056. X    case 7: return("*");
  1057. X    }
  1058. X    return("*");
  1059. X}
  1060. X
  1061. Xchar *Semicode[] = {
  1062. X    "none",
  1063. X    "1 semitone",
  1064. X    "2 semitones",
  1065. X    "3 semitones",
  1066. X    "4 semitones",
  1067. X    "5 semitones",
  1068. X    "6 semitones",
  1069. X    "7 semitones",
  1070. X    "8 semitones",
  1071. X    "9 semitones",
  1072. X    "10 semitones",
  1073. X    "11 semitones",
  1074. X    "1 octave"
  1075. X};
  1076. X
  1077. Xchar *
  1078. Xvisd8sem(v)
  1079. X{
  1080. X    if(v >= 0 && v <= 12) {
  1081. X        return(Semicode[v]);
  1082. X    }
  1083. X    return("*");
  1084. X}
  1085. X
  1086. Xchar *
  1087. Xvisdasel(v)
  1088. X{
  1089. X    switch(v) {
  1090. X    case 0: return("off");
  1091. X    case 1: return("Osc 1");
  1092. X    case 2: return("Osc 2");
  1093. X    case 3: return("Osc 1+2");
  1094. X    }
  1095. X    return("*");
  1096. X}
  1097. X
  1098. Xchar *
  1099. Xvisdamod(v)
  1100. X{
  1101. X    switch(v) {
  1102. X    case 0: return("Up");
  1103. X    case 1: return("Down");
  1104. X    }
  1105. X    return("*");
  1106. X}
  1107. X
  1108. Xchar *
  1109. Xvisd8pol(v)
  1110. X{
  1111. X    switch(v) {
  1112. X    case 0: return("/-\\");
  1113. X    case 1: return("\\_/");
  1114. X    }
  1115. X    return("*");
  1116. X}
  1117. X
  1118. Xchar *
  1119. Xvisdmode(v)
  1120. X{
  1121. X    switch(v) {
  1122. X    case 0: return("Poly 1");
  1123. X    case 1: return("Poly 2");
  1124. X    case 2: return("Uni 1");
  1125. X    case 3: return("Uni 2");
  1126. X    }
  1127. X    return("*");
  1128. X}
  1129. X
  1130. Xchar *
  1131. Xvisdmgw(v)
  1132. X{
  1133. X    switch(v) {
  1134. X    case 0: return("/\\");
  1135. X    case 1: return("|\\");
  1136. X    case 2: return("/|");
  1137. X    case 3: return("_|-|");
  1138. X    }
  1139. X    return("*");
  1140. X}
  1141. X
  1142. Xchar *
  1143. Xvisd8trk(v)
  1144. X{
  1145. X    switch(v) {
  1146. X    case 0: return("0");
  1147. X    case 1: return("1/4");
  1148. X    case 2: return("1/2");
  1149. X    case 3: return("1");
  1150. X    }
  1151. X    return("*");
  1152. X}
  1153. X
  1154. X/* end */
  1155. END_OF_FILE
  1156. if test 10982 -ne `wc -c <'dw8000.mnu'`; then
  1157.     echo shar: \"'dw8000.mnu'\" unpacked with wrong size!
  1158. fi
  1159. # end of 'dw8000.mnu'
  1160. fi
  1161. if test -f 'k5single.mnu' -a "${1}" != "-c" ; then 
  1162.   echo shar: Will not clobber existing file \"'k5single.mnu'\"
  1163. else
  1164. echo shar: Extracting \"'k5single.mnu'\" \(10747 characters\)
  1165. sed "s/^X//" >'k5single.mnu' <<'END_OF_FILE'
  1166. X/* $Id: k5single.mnu,v 1.6 89/05/06 17:13:30 lee Exp $
  1167. X * GLIB - a Generic LIBrarian and editor for synths
  1168. X *
  1169. X * Kawai K-5 Librarian - handles SINGLE (and MULTI) patches.
  1170. X * Functions are annotated if they work for SINGLE, MULTI, or both kinds.
  1171. X * Full editing not implemented - there are zillions of parameters,
  1172. X * and the huge LCD on the K-5 is actually quite easy to read and use.
  1173. X *
  1174. X * Alan Bland - att!druwy!mab
  1175. X * mod. Greg Lee
  1176. X * $Log:    k5single.mnu,v $
  1177. X * Revision 1.6  89/05/06  17:13:30  lee
  1178. X * rel. to comp.sources.misc
  1179. X * 
  1180. X */
  1181. X
  1182. X#define OVERLAY2
  1183. X
  1184. X#include "glib.h"
  1185. X#ifdef BSD
  1186. X#include <ctype.h>
  1187. X#endif
  1188. X
  1189. X#define K5SINGLE    0
  1190. X#define K5MULTI        1
  1191. X#define K5MAGIC        0x5a3c
  1192. X
  1193. X#define NERRS        5
  1194. X#define RESERVESIZE    0
  1195. X
  1196. Xextern char *visnum();
  1197. X
  1198. X/* This array contains arbitrary screen labels (SINGLE) */
  1199. Xstruct labelinfo Lk5s[] = {
  1200. X#MENU
  1201. X
  1202. X
  1203. X
  1204. X          Sorry, no edit capability implemented for the K-5 yet.
  1205. X
  1206. X
  1207. X
  1208. X
  1209. X
  1210. X
  1211. X
  1212. X
  1213. X
  1214. X
  1215. X
  1216. X  +-------------------------+--------------+
  1217. X  |Space = Play Note        | Auto-Note    |
  1218. X  |                         |              |
  1219. X  |h = left   q = quit      |Pitch    %    |
  1220. X  |j = down   N = Set Name  |Volume   %    |
  1221. X  |k = up     J = Decrement |Duration %    |
  1222. X  |l = right  K = Increment |Channel  %    |
  1223. X  |                         |              |
  1224. X  +-------------------------+--------------+
  1225. X#END
  1226. X-1,-1,NULL
  1227. X};
  1228. X
  1229. Xstruct paraminfo  Pk5s[] =  {
  1230. X/*
  1231. XNAME        TYPE    POS    MAX    OFFSET    MASK    SHIFT    ADHOC
  1232. X */
  1233. X#O autopitch    num    %%    127    -60
  1234. X#O autovol    num    %%    127    -63
  1235. X#O autodur    num    %%    20    -5    *5
  1236. X#O autochan    num    %%    16    -1    *5
  1237. XNULL,NULL,-1,-1,-1,-1,visnum,0,0,0,0
  1238. X};
  1239. X
  1240. X
  1241. X
  1242. X/*
  1243. X * k5vnum
  1244. X *
  1245. X * Convert a voice number (0 to 47) to the string displayed in the
  1246. X * librarian (A1-D12)  (SINGLE and MULTI)
  1247. X */
  1248. Xchar *
  1249. Xk5vnum(n)
  1250. Xregister int n;
  1251. X{
  1252. X    static char v[4];
  1253. X
  1254. X    if ( n < 0 || n > 47 )
  1255. X        return("??");
  1256. X
  1257. X    sprintf(v, "%c%d", n/12 + 'A', n%12 + 1);
  1258. X    return(v);
  1259. X}
  1260. X
  1261. X/*
  1262. X * k5numv
  1263. X *
  1264. X * Convert an alphanumeric voice number (A1-D12) to internal
  1265. X * format (0 - 47).  (SINGLE and MULTI)
  1266. X */
  1267. Xk5numv(n)
  1268. Xregister char *n;
  1269. X{
  1270. X    register int v,j;
  1271. X
  1272. X    /* first better be [a-dA-D] */
  1273. X    *n = toupper(*n);
  1274. X    if (*n == 'A' || *n == 'B' || *n == 'C' || *n == 'D') {
  1275. X        v = 12 * (*n - 'A');
  1276. X    } else {
  1277. X        return(-1);
  1278. X    }
  1279. X
  1280. X    /* followed by 1-12 */
  1281. X    j = atoi(++n);
  1282. X    if (j<1 || j>12) return(-1);
  1283. X    return v + j - 1;
  1284. X}
  1285. X
  1286. X/*
  1287. X * k5sdin
  1288. X *
  1289. X * Take library bank 'data' and stuff values in the P array, by using
  1290. X * the setval function.
  1291. X */
  1292. Xk5sdin(data)
  1293. Xchar *data;
  1294. X{
  1295. X    /* We set the 'auto-note' channel upon entry */
  1296. X    setval("autochan",Channel);
  1297. X}
  1298. X
  1299. X/*
  1300. X * k5sdout
  1301. X *
  1302. X * Take (possibly changed) parameters values out of the P array and
  1303. X * put them back into the library bank 'data'.
  1304. X */
  1305. Xk5sdout(data)
  1306. Xchar *data;
  1307. X{
  1308. X    /* If the autochan parameter has changed, update Channel */
  1309. X    Channel = getval("autochan");
  1310. X}
  1311. X
  1312. X/*
  1313. X * k5mdin
  1314. X *
  1315. X * Take library bank 'data' and stuff values in the P array, by using
  1316. X * the setval function.
  1317. X */
  1318. Xk5mdin(data)
  1319. Xchar *data;
  1320. X{
  1321. X    /* We set the 'auto-note' channel upon entry */
  1322. X    setval("autochan",Channel);
  1323. X}
  1324. X
  1325. X/*
  1326. X * k5mdout
  1327. X *
  1328. X * Take (possibly changed) parameters values out of the P array and
  1329. X * put them back into the library bank 'data'.
  1330. X */
  1331. Xk5mdout(data)
  1332. Xchar *data;
  1333. X{
  1334. X    /* If the autochan parameter has changed, update Channel */
  1335. X    Channel = getval("autochan");
  1336. X}
  1337. X
  1338. X/*
  1339. X * k5snof
  1340. X *
  1341. X * Return a pointer to the voice name buried in library bank data. (SINGLE)
  1342. X */
  1343. Xchar *
  1344. Xk5snof(data)
  1345. Xregister char *data;
  1346. X{
  1347. X    static char currbuff[9];
  1348. X    register char *p;
  1349. X    register int m;
  1350. X
  1351. X    p = currbuff;
  1352. X    for ( m=0; m<16; m+=2 )
  1353. X        *p++ = (data[m]<<4) | data[m+1];
  1354. X    *p = '\0';
  1355. X    return(currbuff);
  1356. X}
  1357. X
  1358. X/*
  1359. X * k5nameok
  1360. X *
  1361. X * Convert an ascii string to the ascii subset used for K5 names.
  1362. X */
  1363. Xchar*
  1364. Xk5nameok(name)
  1365. Xchar *name;
  1366. X{
  1367. X    static char okname[9];
  1368. X    register int m;
  1369. X
  1370. X    for (m=0; m<9 && name[m]; ++m) {
  1371. X        okname[m] = toupper(name[m]);
  1372. X        if (!isalnum(okname[m])) {
  1373. X            switch (okname[m]) {
  1374. X            case '-': case ':': case '/': case '*': case '?':
  1375. X            case '!': case '#': case '&': case '(': case ')':
  1376. X            case '"': case '+': case '.': case '=': case ' ':
  1377. X                break;
  1378. X            default:
  1379. X                okname[m] = ' ';
  1380. X                break;
  1381. X            }
  1382. X        }
  1383. X    }
  1384. X    okname[m] = '\0';
  1385. X    return okname;
  1386. X}
  1387. X
  1388. X/*
  1389. X * k5ssnof
  1390. X *
  1391. X * Set the voice name buried in data to name. (SINGLE)
  1392. X */
  1393. Xk5ssnof(data,name)
  1394. Xchar *data;
  1395. Xchar *name;
  1396. X{
  1397. X    register char *p;
  1398. X    register int m;
  1399. X
  1400. X    for ( p=k5nameok(name),m=0; *p!='\0' && m<17; p++,m+=2 ) {
  1401. X        data[m] = (*p & 0xf0) >> 4;
  1402. X        data[m+1] = *p & 0x0f;
  1403. X    }
  1404. X    for ( ; m<17; m+=2 ) {
  1405. X        data[m] = (' ' & 0xf0) >> 4;
  1406. X        data[m+1] = ' ' & 0x0f;
  1407. X    }
  1408. X}
  1409. X/*
  1410. X * k5mnof
  1411. X *
  1412. X * Return a pointer to the voice name buried in library bank data. (MULTI)
  1413. X */
  1414. Xchar *
  1415. Xk5mnof(data)
  1416. Xchar *data;
  1417. X{
  1418. X    static char currbuff[9];
  1419. X    register char *p;
  1420. X    register int m;
  1421. X
  1422. X    p = currbuff;
  1423. X    for ( m=0; m<16; m+=2 )
  1424. X        *p++ = (data[m+330]<<4) | data[m+331];
  1425. X    *p = '\0';
  1426. X    return(currbuff);
  1427. X}
  1428. X
  1429. X/*
  1430. X * k5msnof
  1431. X *
  1432. X * Set the voice name buried in data to name. (MULTI)
  1433. X */
  1434. Xk5msnof(data,name)
  1435. Xchar *data;
  1436. Xchar *name;
  1437. X{
  1438. X    char *p;
  1439. X    int m;
  1440. X
  1441. X    for ( p=k5nameok(name),m=0; *p!='\0' && m<17; p++,m+=2 ) {
  1442. X        data[m+330] = (*p & 0xf0) >> 4;
  1443. X        data[m+331] = *p & 0x0f;
  1444. X    }
  1445. X    for ( ; m<17; m+=2 ) {
  1446. X        data[m+330] = (' ' & 0xf0) >> 4;
  1447. X        data[m+331] = ' ' & 0x0f;
  1448. X    }
  1449. X}
  1450. X
  1451. X/*
  1452. X * k5sbulk
  1453. X *
  1454. X * common function to send all voices to the K-5 (SINGLE and MULTI)
  1455. X */
  1456. Xk5sbulk(data, which)
  1457. Xchar *data;
  1458. Xint which;    /* K5SINGLE or K5MULTI */
  1459. X{
  1460. X    int n, err = 0;
  1461. X    message("");
  1462. X    for (n=0; n<Nvoices; ++n) {
  1463. X        for (err=0; err<NERRS; ++err) {
  1464. X            if (k5sone(n, &(VOICEBYTE(data,n,0)), which ) == 0 ) {
  1465. X                windputc('+');
  1466. X                windrefresh();
  1467. X                break;
  1468. X            }
  1469. X            windputc('-');
  1470. X            windrefresh();
  1471. X        }
  1472. X        if (err == NERRS) return(1);
  1473. X    }
  1474. X    return(0);
  1475. X}
  1476. X
  1477. X/*
  1478. X * k5ssbulk
  1479. X *
  1480. X * send all voices to the K-5 (SINGLE)
  1481. X */
  1482. Xk5ssbulk(data)
  1483. Xchar *data;
  1484. X{
  1485. X    return k5sbulk(data, K5SINGLE);
  1486. X}
  1487. X
  1488. X/*
  1489. X * k5msbulk
  1490. X *
  1491. X * send all voices to the K-5 (MULTI)
  1492. X */
  1493. Xk5msbulk(data)
  1494. Xchar *data;
  1495. X{
  1496. X    return k5sbulk(data, K5MULTI);
  1497. X}
  1498. X
  1499. X/*
  1500. X * k5ssone
  1501. X *
  1502. X * send one voice to the K-5 (SINGLE)
  1503. X */
  1504. Xk5ssone(iv, data)
  1505. Xint iv;
  1506. Xchar *data;
  1507. X{
  1508. X    return k5sone(iv, data, K5SINGLE);
  1509. X}
  1510. X
  1511. X/*
  1512. X * k5msone
  1513. X *
  1514. X * send one voice to the K-5 (MULTI)
  1515. X */
  1516. Xk5msone(iv, data)
  1517. X{
  1518. X    return k5sone(iv, data, K5MULTI);
  1519. X}
  1520. X
  1521. X/*
  1522. X * k5sone
  1523. X *
  1524. X * common function to send a SINGLE or MULTI voice to the K-5.
  1525. X */
  1526. Xk5sone(iv, data, which)
  1527. Xint iv;
  1528. Xregister char *data;
  1529. Xint which;    /* K5SINGLE or K5MULTI */
  1530. X{
  1531. X    register int i, sum;
  1532. X    int length;
  1533. X    int c = 0, ret = 1;
  1534. X    long begin, toolong;
  1535. X
  1536. X    flushmidi();
  1537. X
  1538. X    length = (which == K5SINGLE) ? 984 : 352;
  1539. X
  1540. X    /* calculate checksum */
  1541. X    for (sum=0, i=0; i<length-4; ) {
  1542. X        sum += data[i++] << 4;
  1543. X        sum += data[i++];
  1544. X        sum += data[i++] << 12;
  1545. X        sum += data[i++] << 8;
  1546. X    }
  1547. X
  1548. X    sum = K5MAGIC - sum;
  1549. X    data[length-4] = (sum & 0x00f0) >> 4;
  1550. X    data[length-3] = (sum & 0x000f);
  1551. X    data[length-2] = (sum & 0xf000) >> 12;
  1552. X    data[length-1] = (sum & 0x0f00) >> 8;
  1553. X    
  1554. X    sendmidi(0xf0);
  1555. X    sendmidi(0x40);
  1556. X    sendmidi(Channel-1);
  1557. X    sendmidi(0x20);
  1558. X    sendmidi(0x00);
  1559. X    sendmidi(0x02);
  1560. X    sendmidi(which);
  1561. X    sendmidi(iv);
  1562. X
  1563. X    for (i=0; i<length; i++) sendmidi(data[i]);
  1564. X
  1565. X    sendmidi(EOX);
  1566. X
  1567. X    /* read the ack/nack - set up for timeout */
  1568. X    begin = milliclock();
  1569. X    toolong = begin + 1000 * TIMEOUT;
  1570. X
  1571. X    /* wait for the acknowledgement */
  1572. X    while ( milliclock() < toolong ) {
  1573. X        if ( STATMIDI && (c=(getmidi() & 0xff)) == 0xf0 )
  1574. X            break;
  1575. X    }
  1576. X    if ( c != 0xf0 ) {
  1577. X        Reason = "Timeout waiting for K-5 response";
  1578. X        goto getout;
  1579. X    }
  1580. X    
  1581. X    /* third byte after the sysex begin is the result */
  1582. X    for (i=0; i<3; ) {
  1583. X        /* wait for midi byte or timeout */
  1584. X        while ( ! STATMIDI ) {
  1585. X            if ( milliclock() > toolong ) {
  1586. X                Reason = "Timeout waiting for K-5 response";
  1587. X                goto getout;
  1588. X            }
  1589. X        }
  1590. X        /* ignore active sensing */
  1591. X        if ((c = getmidi() & 0xff) != 0xfe) {
  1592. X            ++i;
  1593. X        }
  1594. X    }
  1595. X
  1596. X    /* check the result */
  1597. X    switch (c) {
  1598. X    case 0x40:
  1599. X        ret = 0;
  1600. X        Reason = "";
  1601. X        break;
  1602. X    case 0x41:
  1603. X        Reason = "K-5 write error";
  1604. X        break;
  1605. X    case 0x42:
  1606. X        Reason = "K-5 write error (protected)";
  1607. X        break;
  1608. X    case 0x43:
  1609. X        Reason = "K-5 write error (no card)";
  1610. X        break;
  1611. X    default:
  1612. X        Reason = "Wierd response (is that really a K-5 you have?)";
  1613. X        break;
  1614. X    }
  1615. X
  1616. Xgetout:
  1617. X    return(ret);
  1618. X}
  1619. X
  1620. Xk5ssedit()
  1621. X{
  1622. X}
  1623. X
  1624. Xk5msedit()
  1625. X{
  1626. X}
  1627. X
  1628. X/*
  1629. X * k5sgbulk
  1630. X *
  1631. X * get all internal SINGLE voices from K-5.
  1632. X */
  1633. Xk5sgbulk(data)
  1634. Xchar *data;
  1635. X{
  1636. X    return k5gbulk(data, K5SINGLE);
  1637. X}
  1638. X
  1639. X/*
  1640. X * k5mgbulk
  1641. X *
  1642. X * get all internal MULTI voices from K-5.
  1643. X */
  1644. Xk5mgbulk(data)
  1645. Xchar *data;
  1646. X{
  1647. X    return k5gbulk(data, K5MULTI);
  1648. X}
  1649. X
  1650. X/*
  1651. X * k5gbulk
  1652. X *
  1653. X * common routine - get all SINGLE or MULTI voices from K-5.
  1654. X */
  1655. Xk5gbulk(data, which)
  1656. Xregister char *data;
  1657. Xint which;    /* K5SINGLE or K5MULTI */
  1658. X{
  1659. X    int c, v, sumerr = 0;
  1660. X    register int n, i, sum;
  1661. X    long begin, toolong;
  1662. X
  1663. X    message("");
  1664. X    flushmidi();
  1665. X
  1666. X    for(v = 0; v < Nvoices; v++) {
  1667. X
  1668. Xretry:        
  1669. X        if (which == K5MULTI) {
  1670. X            /* i don't know if this is a K-5 or Amiga problem */
  1671. X            /* but multi patch download seems to need this delay */
  1672. X            millisleep(500);
  1673. X        }
  1674. X        /* request the voice */
  1675. X        sendmidi(0xf0);
  1676. X        sendmidi(0x40);
  1677. X        sendmidi(Channel-1);
  1678. X        sendmidi(0x00);
  1679. X        sendmidi(0x00);
  1680. X        sendmidi(0x02);
  1681. X        sendmidi(which);
  1682. X        sendmidi(v);
  1683. X        sendmidi(EOX);
  1684. X    
  1685. X        /* set up for timeout */
  1686. X        begin = milliclock();
  1687. X        toolong = begin + 1000 * TIMEOUT;
  1688. X    
  1689. X        /* wait for the xf0 byte starting the dump */
  1690. X        while ( milliclock() < toolong ) {
  1691. X            if ( STATMIDI && (c=(getmidi() & 0xff)) == 0xf0 )
  1692. X                break;
  1693. X        }
  1694. X        if ( c != 0xf0 ) {
  1695. X            Reason = "Timeout waiting for dump from K-5";
  1696. X            return 1;
  1697. X        }
  1698. X/*printf("%02x ", c);*/
  1699. X        /* skip the next 7 bytes (remainder of sysex header) */
  1700. X        for (i=0; i<7; ) {
  1701. X            /* wait for midi byte or timeout */
  1702. X            while ( ! STATMIDI ) {
  1703. X                if ( milliclock() > toolong )
  1704. X                    goto timeout;
  1705. X            }
  1706. X            /* ignore active sensing */
  1707. X            if ((c = getmidi() & 0xff) != 0xfe) {
  1708. X                ++i;
  1709. X/*printf("%02x ", c);*/
  1710. X            }
  1711. X        }
  1712. X
  1713. X        /* read voice data until EOX */
  1714. X        n = 0;
  1715. X        while (1) {
  1716. X            /* wait for midi byte or timeout */
  1717. X            while ( ! STATMIDI ) {
  1718. X                if ( milliclock() > toolong )
  1719. X                    goto timeout;
  1720. X            }
  1721. X            if ((c = getmidi() & 0xff) == 0xfe) {
  1722. X                /* ignore active sensing */
  1723. X                continue;
  1724. X            } else if (c == EOX) {
  1725. X                /* finished */
  1726. X                break;
  1727. X            } else {
  1728. X                /* got a data byte */
  1729. X                VOICEBYTE(data,v,n) = c;
  1730. X                ++n;
  1731. X            }
  1732. X        }
  1733. X/*printf("got block n=%d\n", n);*/
  1734. X        /* verify the checksum */
  1735. X        for (sum=0, i=0; i<n-4; ) {
  1736. X            sum += data[i++] << 4;
  1737. X            sum += data[i++];
  1738. X            sum += data[i++] << 12;
  1739. X            sum += data[i++] << 8;
  1740. X        }
  1741. X
  1742. X        sum = K5MAGIC - sum;
  1743. X        if ((data[n-4] == (sum & 0x00f0) >> 4) &&
  1744. X            (data[n-3] == (sum & 0x000f)) &&
  1745. X            (data[n-2] == (sum & 0xf000) >> 12) &&
  1746. X            (data[n-1] == (sum & 0x0f00) >> 8)) {
  1747. X            sumerr = 0;
  1748. X            windputc('+');
  1749. X        } else {
  1750. X            /* retry a few times if checksum failed */
  1751. X            windputc('-');
  1752. X            if (sumerr++ >= NERRS) {
  1753. X                Reason = "Too many checksum errors!";
  1754. X                return(1);
  1755. X            }
  1756. X            goto retry;
  1757. X        }
  1758. X        windrefresh();
  1759. X
  1760. X    } /* go back for another voice */
  1761. X    Reason = "";
  1762. X    return(0);
  1763. X
  1764. Xtimeout:
  1765. X    Reason = "Timeout while reading!";
  1766. X    return(1);
  1767. X}
  1768. X
  1769. END_OF_FILE
  1770. if test 10747 -ne `wc -c <'k5single.mnu'`; then
  1771.     echo shar: \"'k5single.mnu'\" unpacked with wrong size!
  1772. fi
  1773. # end of 'k5single.mnu'
  1774. fi
  1775. if test -f 'vis.c' -a "${1}" != "-c" ; then 
  1776.   echo shar: Will not clobber existing file \"'vis.c'\"
  1777. else
  1778. echo shar: Extracting \"'vis.c'\" \(10248 characters\)
  1779. sed "s/^X//" >'vis.c' <<'END_OF_FILE'
  1780. X/* $Id: vis.c,v 1.6 89/05/06 17:13:46 lee Exp $
  1781. X * GLIB - a Generic LIBrarian and editor for synths
  1782. X *
  1783. X * Data Display Routines
  1784. X *
  1785. X * Code started 16 JAN 89 --  Michael R. Kesti mrk@gvgspd.GVG.TEK.COM
  1786. X * $Log:    vis.c,v $
  1787. X * Revision 1.6  89/05/06  17:13:46  lee
  1788. X * rel. to comp.sources.misc
  1789. X * 
  1790. X */
  1791. X
  1792. X#include <stdio.h>
  1793. X
  1794. X
  1795. Xchar *
  1796. Xvispan(v)
  1797. X{
  1798. X    switch (v) {
  1799. X    case 0: return("7>");
  1800. X    case 1: return("6>");
  1801. X    case 2: return("5>");
  1802. X    case 3: return("4>");
  1803. X    case 4: return("3>");
  1804. X    case 5: return("2>");
  1805. X    case 6: return("1>");
  1806. X    case 7: return("><");
  1807. X    case 8: return("<1");
  1808. X    case 9: return("<2");
  1809. X    case 10: return("<3");
  1810. X    case 11: return("<4");
  1811. X    case 12: return("<5");
  1812. X    case 13: return("<6");
  1813. X    case 14: return("<7");
  1814. X    }
  1815. X    return("*");
  1816. X}
  1817. X
  1818. Xchar *
  1819. Xvisreverbtype(v)
  1820. X{
  1821. X    switch (v) {
  1822. X    case 0: return("ROOM 1");
  1823. X    case 1: return("ROOM 2");
  1824. X    case 2: return("HALL 1");
  1825. X    case 3: return("HALL 2");
  1826. X    case 4: return("PLATE");
  1827. X    case 5: return("DELAY 1");
  1828. X    case 6: return("DELAY 2");
  1829. X    case 7: return("DELAY 3");
  1830. X    case 8: return("OFF");
  1831. X    }
  1832. X    return("*");
  1833. X}
  1834. X
  1835. Xchar *visreverbtime(v)
  1836. X{
  1837. Xstatic char visreverbtimebuf[2];
  1838. X
  1839. X    if((v >= 0) && (v <= 7)) {
  1840. X        sprintf(visreverbtimebuf,"%d",v + 1);
  1841. X        return(visreverbtimebuf);
  1842. X    } else {
  1843. X        return("*");
  1844. X    }
  1845. X}
  1846. X
  1847. Xchar *visreverblevel(v)
  1848. X{
  1849. Xstatic char visreverblevelbuf[2];
  1850. X
  1851. X    if((v >= 0) && (v <= 7)) {
  1852. X        sprintf(visreverblevelbuf,"%d",v);
  1853. X        return(visreverblevelbuf);
  1854. X    } else {
  1855. X        return("*");
  1856. X    }
  1857. X}
  1858. X
  1859. Xchar *vispatchlevel(v)
  1860. X{
  1861. Xstatic char vispatchlevelbuf[4];
  1862. X
  1863. X    if((v >= 0) && (v <= 100)) {
  1864. X        sprintf(vispatchlevelbuf,"%d",v);
  1865. X        return(vispatchlevelbuf);
  1866. X    } else {
  1867. X        return("*");
  1868. X    }
  1869. X}
  1870. X
  1871. Xchar *
  1872. Xviskeymode(v)
  1873. X{
  1874. X    switch (v) {
  1875. X    case 0: return("WHOLE");
  1876. X    case 1: return("DUAL");
  1877. X    case 2: return("SPLIT");
  1878. X    }
  1879. X    return("*");
  1880. X}
  1881. X
  1882. Xstatic    char *split_table[] = {
  1883. X    "C",
  1884. X    "C#",
  1885. X    "D",
  1886. X    "D#",
  1887. X    "E",
  1888. X    "F",
  1889. X    "F#",
  1890. X    "G",
  1891. X    "G#",
  1892. X    "A",
  1893. X    "A#",
  1894. X    "B"
  1895. X};
  1896. X
  1897. Xchar *
  1898. Xvissplit(v)
  1899. X{
  1900. Xstatic    char    vissplitbuf[4];
  1901. X
  1902. X    if((v >= 0) && (v <= 61)) {
  1903. X        strcpy(vissplitbuf, split_table[v % 12]);
  1904. X        if(strlen(vissplitbuf) == 1) {
  1905. X            vissplitbuf[1] = (((v / 12) + 2) + '0');
  1906. X            vissplitbuf[2] = 0;
  1907. X        } else {
  1908. X            vissplitbuf[2] = (((v / 12) + 2) + '0');
  1909. X            vissplitbuf[3] = 0;
  1910. X        }
  1911. X        return(vissplitbuf);
  1912. X    } else {
  1913. X    return("*");
  1914. X    }
  1915. X}
  1916. X
  1917. Xchar *
  1918. Xvistonegroup(v)
  1919. X{
  1920. X    switch (v) {
  1921. X    case 0: return("A");
  1922. X    case 1: return("B");
  1923. X    case 2: return("I");
  1924. X    case 3: return("R");
  1925. X    }
  1926. X    return("*");
  1927. X}
  1928. X
  1929. Xchar *
  1930. Xvisrtone(v)
  1931. X{
  1932. Xstatic char visrtonebuf[4];
  1933. X    if(v >= 0 && v <= 127) {
  1934. X        if(v < 64) {
  1935. X            sprintf(visrtonebuf,"% 02d",v + 1);
  1936. X            visrtonebuf[0] = 'I';
  1937. X        } else {
  1938. X            if(v == 127) {
  1939. X                strcpy(visrtonebuf, "OFF");
  1940. X            } else {
  1941. X                v -= 64;
  1942. X                sprintf(visrtonebuf," %02d",v + 1);
  1943. X                visrtonebuf[0] = 'R';
  1944. X            }
  1945. X        }
  1946. X        return(visrtonebuf);
  1947. X    }
  1948. X    return("*");
  1949. X}
  1950. X
  1951. Xchar *vistonenum(v)
  1952. X{
  1953. Xstatic char vistonenumbuf[3];
  1954. X
  1955. X    if((v >= 0) && (v <= 63)) {
  1956. X        sprintf(vistonenumbuf,"%02d",v + 1);
  1957. X        return(vistonenumbuf);
  1958. X    } else {
  1959. X        return("*");
  1960. X    }
  1961. X}
  1962. X
  1963. Xchar *viskeyshift(v)
  1964. X{
  1965. Xstatic char viskeyshiftbuf[4];
  1966. X
  1967. X    if((v >= 0) && (v <= 23)) {
  1968. X        sprintf(viskeyshiftbuf,"-%d",abs(v - 24));
  1969. X        return(viskeyshiftbuf);
  1970. X    } else if(v == 24) {
  1971. X        sprintf(viskeyshiftbuf,"0");
  1972. X        return(viskeyshiftbuf);
  1973. X    } else if((v >= 25) && (v <= 48)) {
  1974. X        sprintf(viskeyshiftbuf,"+%d", (v - 24));
  1975. X        return(viskeyshiftbuf);
  1976. X    } else {
  1977. X        return("*");
  1978. X    }
  1979. X}
  1980. X
  1981. Xchar *visfinetune(v)
  1982. X{
  1983. Xstatic char visfinetunebuf[4];
  1984. X
  1985. X    if((v >= 0) && (v <= 49)) {
  1986. X        sprintf(visfinetunebuf,"-%d",abs(v - 50));
  1987. X        return(visfinetunebuf);
  1988. X    } else if(v == 50) {
  1989. X        sprintf(visfinetunebuf,"0");
  1990. X        return(visfinetunebuf);
  1991. X    } else if((v >= 51) && (v <= 100)) {
  1992. X        sprintf(visfinetunebuf,"+%d",(v - 50));
  1993. X        return(visfinetunebuf);
  1994. X    } else {
  1995. X        return("*");
  1996. X    }
  1997. X}
  1998. X
  1999. Xchar *visbendrange(v)
  2000. X{
  2001. Xstatic char visbendrangebuf[3];
  2002. X
  2003. X    if((v >= 0) && (v <= 24)) {
  2004. X        sprintf(visbendrangebuf,"%d",v);
  2005. X        return(visbendrangebuf);
  2006. X    } else {
  2007. X        return("*");
  2008. X    }
  2009. X}
  2010. X
  2011. Xchar *visassignmode(v)
  2012. X{
  2013. Xstatic char visassignmodebuf[2];
  2014. X
  2015. X    if((v >= 0) && (v <= 3)) {
  2016. X        sprintf(visassignmodebuf,"%d",v);
  2017. X        return(visassignmodebuf);
  2018. X    } else {
  2019. X        return("*");
  2020. X    }
  2021. X}
  2022. X
  2023. Xchar *vistonebal(v)
  2024. X{
  2025. Xstatic char vistonebalbuf[30];
  2026. Xstatic char vistonebalbuf1[30];
  2027. Xint n;
  2028. X
  2029. X    if((v >= 0) && (v <= 100)) {
  2030. X        sprintf(vistonebalbuf,"%d", v);
  2031. X        for(n = 0 ; n < (30 - strlen(vistonebalbuf)) ; n++)
  2032. X            strcat(vistonebalbuf, " ");
  2033. X        sprintf(vistonebalbuf1,"%d", abs(v - 100));
  2034. X        strcat(vistonebalbuf, vistonebalbuf1);
  2035. X        return(vistonebalbuf);
  2036. X    } else {
  2037. X        return("*");
  2038. X    }
  2039. X}
  2040. X
  2041. Xchar *
  2042. Xvisstruct(v)
  2043. X{
  2044. X    if((v >= 0) && (v <= 12)) {
  2045. X        switch(v) {
  2046. X            case 0:
  2047. X                return("~l~l~u~u~u __|_ ~d~l~l~l~l~l~l|    |~d~l~l~l~l~l~l|    |~d~l~l~l~l~l~lS 1  S");
  2048. X                break;
  2049. X            case 1:
  2050. X                return("~l~l~u~u~u __|  ~d~l~l~l~l~l~l| RM  ~d~l~l~l~l~l~l|/  \\ ~d~l~l~l~l~l~lS 2  S");
  2051. X                break;
  2052. X            case 2:
  2053. X                return("~l~l~u~u~u __|_ ~d~l~l~l~l~l~l|    |~d~l~l~l~l~l~l|    |~d~l~l~l~l~l~lP 3  S");
  2054. X                break;
  2055. X            case 3:
  2056. X                return("~l~l~u~u~u __|  ~d~l~l~l~l~l~l| RM  ~d~l~l~l~l~l~l|/  \\ ~d~l~l~l~l~l~lP 4  S");
  2057. X                break;
  2058. X            case 4:
  2059. X                return("~l~l~u~u~u __|  ~d~l~l~l~l~l~l| RM  ~d~l~l~l~l~l~l|/  \\ ~d~l~l~l~l~l~lS 5  P");
  2060. X                break;
  2061. X            case 5:
  2062. X                return("~l~l~u~u~u __|_ ~d~l~l~l~l~l~l|    |~d~l~l~l~l~l~l|    |~d~l~l~l~l~l~lP 6  P");
  2063. X                break;
  2064. X            case 6:
  2065. X                return("~l~l~u~u~u __|  ~d~l~l~l~l~l~l| RM  ~d~l~l~l~l~l~l|/  \\ ~d~l~l~l~l~l~lP 7  P");
  2066. X                break;
  2067. X            case 7:
  2068. X                return("~l~l~u~u~u|    |~d~l~l~l~l~l~l|    |~d~l~l~l~l~l~l|    |~d~l~l~l~l~l~lS 8  S");
  2069. X                break;
  2070. X            case 8:
  2071. X                return("~l~l~u~u~u|    |~d~l~l~l~l~l~l|    |~d~l~l~l~l~l~l|    |~d~l~l~l~l~l~lP 9  P");
  2072. X                break;
  2073. X            case 9:
  2074. X                return("~l~l~u~u~u   |  ~d~l~l~l~l~l~l  RM  ~d~l~l~l~l~l~l /  \\ ~d~l~l~l~l~l~lS 10 S");
  2075. X                break;
  2076. X            case 10:
  2077. X                return("~l~l~u~u~u   |  ~d~l~l~l~l~l~l  RM  ~d~l~l~l~l~l~l /  \\ ~d~l~l~l~l~l~lP 11 S");
  2078. X                break;
  2079. X            case 11:
  2080. X                return("~l~l~u~u~u   |  ~d~l~l~l~l~l~l  RM  ~d~l~l~l~l~l~l /  \\ ~d~l~l~l~l~l~lS 12 P");
  2081. X                break;
  2082. X            case 12:
  2083. X                return("~l~l~u~u~u   |  ~d~l~l~l~l~l~l  RM  ~d~l~l~l~l~l~l /  \\ ~d~l~l~l~l~l~lP 13 P");
  2084. X                break;
  2085. X        }
  2086. X    } else {
  2087. X        return("*");
  2088. X    }
  2089. X}
  2090. X
  2091. Xchar *
  2092. Xvispmute(v)
  2093. X{
  2094. X    switch (v) {
  2095. X    case 0: return("_    _    _    _");
  2096. X    case 1: return("1    _    _    _");
  2097. X    case 2: return("_    2    _    _");
  2098. X    case 3: return("1    2    _    _");
  2099. X    case 4: return("_    _    3    _");
  2100. X    case 5: return("1    _    3    _");
  2101. X    case 6: return("_    2    3    _");
  2102. X    case 7: return("1    2    3    _");
  2103. X    case 8: return("_    _    _    4");
  2104. X    case 9: return("1     _   _    4");
  2105. X    case 10: return("_    2    _    4");
  2106. X    case 11: return("1    2    _    4");
  2107. X    case 12: return("_    _    3    4");
  2108. X    case 13: return("1    _    3    4");
  2109. X    case 14: return("_    2    3    4");
  2110. X    case 15: return("1    2    3    4");
  2111. X    }
  2112. X    return("*");
  2113. X}
  2114. X
  2115. Xchar *
  2116. Xvisenvmode(v)
  2117. X{
  2118. X    switch (v) {
  2119. X    case 0: return("NORMAL");
  2120. X    case 1: return("NO SUSTAIN");
  2121. X    }
  2122. X    return("*");
  2123. X}
  2124. X
  2125. Xstatic    char *cpitch_table[] = {
  2126. X    "C",
  2127. X    "C#",
  2128. X    "D",
  2129. X    "D#",
  2130. X    "E",
  2131. X    "F",
  2132. X    "F#",
  2133. X    "G",
  2134. X    "G#",
  2135. X    "A",
  2136. X    "A#",
  2137. X    "B"
  2138. X};
  2139. X
  2140. Xchar *
  2141. Xviscpitch(v)
  2142. X{
  2143. Xstatic    char    viscpitchbuf[4];
  2144. X
  2145. X    if((v >= 0) && (v <= 96)) {
  2146. X        strcpy(viscpitchbuf, cpitch_table[v % 12]);
  2147. X        if(strlen(viscpitchbuf) == 1) {
  2148. X            viscpitchbuf[1] = (((v / 12) + 1) + '0');
  2149. X            viscpitchbuf[2] = 0;
  2150. X        } else {
  2151. X            viscpitchbuf[2] = (((v / 12) + 1) + '0');
  2152. X            viscpitchbuf[3] = 0;
  2153. X        }
  2154. X        return(viscpitchbuf);
  2155. X    } else {
  2156. X    return("*");
  2157. X    }
  2158. X}
  2159. X
  2160. Xchar *
  2161. Xvispkeyfol(v)
  2162. X{
  2163. X    switch (v) {
  2164. X    case 0: return("-1");
  2165. X    case 1: return("-1/2");
  2166. X    case 2: return("-1/4");
  2167. X    case 3: return("0");
  2168. X    case 4: return("1/8");
  2169. X    case 5: return("1/4");
  2170. X    case 6: return("3/8");
  2171. X    case 7: return("1/2");
  2172. X    case 8: return("5/8");
  2173. X    case 9: return("3/4");
  2174. X    case 10: return("7/8");
  2175. X    case 11: return("1");
  2176. X    case 12: return("5/4");
  2177. X    case 13: return("3/2");
  2178. X    case 14: return("2");
  2179. X    case 15: return("s1");
  2180. X    case 16: return("s2");
  2181. X    }
  2182. X    return("*");
  2183. X}
  2184. X
  2185. Xchar *
  2186. Xvistkeyfol(v)
  2187. X{
  2188. X    switch (v) {
  2189. X    case 0: return("-1");
  2190. X    case 1: return("-1/2");
  2191. X    case 2: return("-1/4");
  2192. X    case 3: return("0");
  2193. X    case 4: return("1/8");
  2194. X    case 5: return("1/4");
  2195. X    case 6: return("3/8");
  2196. X    case 7: return("1/2");
  2197. X    case 8: return("5/8");
  2198. X    case 9: return("3/4");
  2199. X    case 10: return("7/8");
  2200. X    case 11: return("1");
  2201. X    case 12: return("5/4");
  2202. X    case 13: return("3/2");
  2203. X    case 14: return("2");
  2204. X    }
  2205. X    return("*");
  2206. X}
  2207. X
  2208. Xchar *viswavebank(v)
  2209. X{
  2210. X    switch (v) {
  2211. X    case 0: return("SQU1");
  2212. X    case 1: return("SAW1");
  2213. X    case 2: return("SQU2");
  2214. X    case 3: return("SAW2");
  2215. X    }
  2216. X    return("*");
  2217. X}
  2218. X
  2219. Xchar *vispcmnum(v)
  2220. X{
  2221. Xstatic char vispcmnumbuf[3];
  2222. X
  2223. X    if((v >= 0) && (v <= 127)) {
  2224. X        sprintf(vispcmnumbuf,"%d",v + 1);
  2225. X        return(vispcmnumbuf);
  2226. X    } else {
  2227. X        return("*");
  2228. X    }
  2229. X}
  2230. X
  2231. Xchar *visvelsens(v)
  2232. X{
  2233. Xstatic char visvelsensbuf[3];
  2234. X
  2235. X    if((v >= 0) && (v <= 6)) {
  2236. X        sprintf(visvelsensbuf,"-%d",abs(v - 7));
  2237. X        return(visvelsensbuf);
  2238. X    } else if(v == 7) {
  2239. X        sprintf(visvelsensbuf,"0");
  2240. X        return(visvelsensbuf);
  2241. X    } else if((v >= 8) && (v <= 14)) {
  2242. X        sprintf(visvelsensbuf,"+%d",abs(v - 7));
  2243. X        return(visvelsensbuf);
  2244. X    } else {
  2245. X        return("*");
  2246. X    }
  2247. X}
  2248. X
  2249. Xchar *visenvlev(v)
  2250. X{
  2251. Xstatic char visenvlevbuf[4];
  2252. X
  2253. X    if((v >= 0) && (v <= 49)) {
  2254. X        sprintf(visenvlevbuf,"-%d",abs(v - 50));
  2255. X        return(visenvlevbuf);
  2256. X    } else if(v == 50) {
  2257. X        sprintf(visenvlevbuf,"0");
  2258. X        return(visenvlevbuf);
  2259. X    } else if((v >= 51) && (v <= 100)) {
  2260. X        sprintf(visenvlevbuf,"+%d",abs(v - 50));
  2261. X        return(visenvlevbuf);
  2262. X    } else {
  2263. X        return("*");
  2264. X    }
  2265. X}
  2266. X
  2267. Xchar *visbiaslev(v)
  2268. X{
  2269. Xstatic char visbiaslevbuf[3];
  2270. X
  2271. X    if((v >= 0) && (v <= 6)) {
  2272. X        sprintf(visbiaslevbuf,"-%d",abs(v - 7));
  2273. X        return(visbiaslevbuf);
  2274. X    } else if(v == 7) {
  2275. X        sprintf(visbiaslevbuf,"0");
  2276. X        return(visbiaslevbuf);
  2277. X    } else if((v >= 8) && (v <= 14)) {
  2278. X        sprintf(visbiaslevbuf,"+%d",abs(v - 7));
  2279. X        return(visbiaslevbuf);
  2280. X    } else {
  2281. X        return("*");
  2282. X    }
  2283. X}
  2284. X
  2285. Xstatic    char *bpitch_table[] = {
  2286. X    "A",
  2287. X    "A#",
  2288. X    "B",
  2289. X    "C",
  2290. X    "C#",
  2291. X    "D",
  2292. X    "D#",
  2293. X    "E",
  2294. X    "F",
  2295. X    "F#",
  2296. X    "G",
  2297. X    "G#"
  2298. X};
  2299. X
  2300. Xchar *
  2301. Xvisbiaspd(v)
  2302. X{
  2303. Xstatic    char    visbiaspdbuf[5];
  2304. Xstatic    char    visbiaspdbuf1[2];
  2305. X
  2306. X    if((v >= 0) && (v <= 127)) {
  2307. X        if(v >= 64) {
  2308. X            strcpy(visbiaspdbuf, ">");
  2309. X            v -= 64;
  2310. X        } else {
  2311. X            strcpy(visbiaspdbuf, "<");
  2312. X        }
  2313. X        strcat(visbiaspdbuf, bpitch_table[v % 12]);
  2314. X        v += 9;
  2315. X        sprintf(visbiaspdbuf1, "%d", (v / 12) + 1);
  2316. X        strcat(visbiaspdbuf, visbiaspdbuf1);
  2317. X        return(visbiaspdbuf);
  2318. X    } else {
  2319. X        return("*");
  2320. X    }
  2321. X}
  2322. X
  2323. Xchar *vistvablev(v)
  2324. X{
  2325. Xstatic char vistvablevbuf[4];
  2326. X
  2327. X    if((v >= 0) && (v <= 12)) {
  2328. X        if(v == 12) {
  2329. X            return("0");
  2330. X        } else {
  2331. X            sprintf(vistvablevbuf,"-%d",abs(v - 12));
  2332. X            return(vistvablevbuf);
  2333. X        }
  2334. X    } else {
  2335. X        return("*");
  2336. X    }
  2337. X}
  2338. X
  2339. X/* end */
  2340. END_OF_FILE
  2341. if test 10248 -ne `wc -c <'vis.c'`; then
  2342.     echo shar: \"'vis.c'\" unpacked with wrong size!
  2343. fi
  2344. # end of 'vis.c'
  2345. fi
  2346. echo shar: End of archive 5 \(of 15\).
  2347. cp /dev/null ark5isdone
  2348. MISSING=""
  2349. for I in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ; do
  2350.     if test ! -f ark${I}isdone ; then
  2351.     MISSING="${MISSING} ${I}"
  2352.     fi
  2353. done
  2354. if test "${MISSING}" = "" ; then
  2355.     echo You have unpacked all 15 archives.
  2356.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2357. else
  2358.     echo You still need to unpack the following archives:
  2359.     echo "        " ${MISSING}
  2360. fi
  2361. ##  End of shell archive.
  2362. exit 0
  2363.  
  2364.